"""
认证相关的 Pydantic 模式
Pydantic 是 FastAPI 的核心组件，用于数据验证和序列化
"""
from typing import Optional
from pydantic import BaseModel, EmailStr, Field
from datetime import datetime


class UserLogin(BaseModel):
    """
    用户登录请求模式
    定义了登录时需要的数据格式和验证规则
    """
    username: str = Field(..., min_length=3, max_length=50, description="用户名")
    password: str = Field(..., min_length=6, description="密码")

    class Config:
        # 提供示例数据，用于API文档
        schema_extra = {
            "example": {
                "username": "admin",
                "password": "123456"
            }
        }


class UserCreate(BaseModel):
    """
    创建用户请求模式
    用于注册新用户时的数据验证
    """
    username: str = Field(..., min_length=3, max_length=50, description="用户名")
    password: str = Field(..., min_length=6, description="密码")
    role: str = Field(default="admin", description="用户角色")

    class Config:
        schema_extra = {
            "example": {
                "username": "newadmin",
                "password": "newpassword",
                "role": "admin"
            }
        }


class UserResponse(BaseModel):
    """
    用户信息响应模式
    定义了返回给前端的用户数据格式
    注意：不包含密码等敏感信息
    """
    id: int
    username: str
    role: str
    is_active: bool
    created_at: datetime
    updated_at: Optional[datetime] = None

    class Config:
        # 允许从 SQLAlchemy 模型创建 Pydantic 模型
        from_attributes = True


class Token(BaseModel):
    """
    JWT Token 响应模式
    登录成功后返回的token信息
    """
    access_token: str = Field(..., description="访问令牌")
    token_type: str = Field(default="bearer", description="令牌类型")
    expires_in: int = Field(..., description="过期时间（秒）")

    class Config:
        schema_extra = {
            "example": {
                "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
                "token_type": "bearer",
                "expires_in": 1800
            }
        }


class TokenData(BaseModel):
    """
    Token 数据模式
    用于解析JWT token中的用户信息
    """
    username: Optional[str] = None
    user_id: Optional[int] = None